package com.macro.mall.tiny.utils;

import java.util.Date;
import java.util.Calendar;
import java.text.SimpleDateFormat;

import java.util.Date;
import java.util.Calendar;
import java.text.SimpleDateFormat;

import java.util.Date;
import java.util.Calendar;
import java.text.SimpleDateFormat;

public class DateUtils {

    /**
     * 将Date对象转换为相对时间的字符串，或指定格式的字符串。
     * 根据以下规则：
     * - 在10秒内，返回几秒前
     * - 在一小时内（大于等于10秒），返回几分钟前
     * - 在当天（大于等于1小时），返回HH:mm:ss
     * - 不在当天但在当年，返回MM-dd HH:mm:ss
     * - 不在当年，返回yyyy-MM-dd HH:mm:ss
     *
     * @param date 需要转换的Date对象
     * @return 相对时间字符串或指定格式的日期时间字符串
     */
    public static String formatRelativeTime(Date date) {
        if (date == null) {
            return ""; // 或者抛出异常，取决于你的需求
        }

        long currentTimeMillis = System.currentTimeMillis();
        long dateTimeMillis = date.getTime();
        long timeDiffSeconds = (currentTimeMillis - dateTimeMillis) / 1000;

        if (timeDiffSeconds < 10) {
            return timeDiffSeconds + "秒前";
        } else if (timeDiffSeconds < 60 * 60) { // 小于1小时 (3600秒)
            long minutes = timeDiffSeconds / 60;
            return minutes + "分钟前";
        } else {
            // 检查是否是同一天
            Calendar currentCalendar = Calendar.getInstance();
            Calendar dateCalendar = Calendar.getInstance();
            dateCalendar.setTime(date);

            // 比较年、月、日
            boolean isSameDay = currentCalendar.get(Calendar.YEAR) == dateCalendar.get(Calendar.YEAR) &&
                    currentCalendar.get(Calendar.DAY_OF_YEAR) == dateCalendar.get(Calendar.DAY_OF_YEAR);

            if (isSameDay) {
                // 在当天（且时间差大于等于1小时，否则在前两个条件已返回），返回HH:mm:ss
                SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
                return sdf.format(date);
            } else {
                // 不在当天，检查是否在当年
                int currentYear = currentCalendar.get(Calendar.YEAR);
                int dateYear = dateCalendar.get(Calendar.YEAR);

                if (currentYear == dateYear) {
                    // 不在当天但在当年，返回MM-dd HH:mm:ss
                    SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm:ss");
                    return sdf.format(date);
                } else {
                    // 不在当年，返回yyyy-MM-dd HH:mm:ss
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    return sdf.format(date);
                }
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        // 示例用法

        // 几秒前
        Date date1 = new Date();
        Thread.sleep(5000); // 等待5秒
        System.out.println("5秒前的日期: " + formatRelativeTime(date1));

        // 几分钟前
        Date date2 = new Date(System.currentTimeMillis() - 20 * 60 * 1000); // 20分钟前
        System.out.println("20分钟前的日期: " + formatRelativeTime(date2));

        // 当天 HH:mm:ss (模拟当天较早时间，例如今天早上8点)
        Calendar calTodayEarlier = Calendar.getInstance();
        calTodayEarlier.set(Calendar.HOUR_OF_DAY, 8);
        calTodayEarlier.set(Calendar.MINUTE, 0);
        calTodayEarlier.set(Calendar.SECOND, 0);
        Date date3 = calTodayEarlier.getTime();
        // 确保当前时间晚于8点，以便显示 HH:mm:ss
        if (System.currentTimeMillis() > date3.getTime() + 60 * 60 * 1000) { // 确保时间差大于1小时
            System.out.println("当天较早时间 (8:00:00): " + formatRelativeTime(date3));
        } else {
            System.out.println("请调整系统时间或代码，以便测试当天较早时间的情况（需与当前时间差大于1小时）。");
        }


        // 不在当天但在当年 MM-dd HH:mm:ss (模拟本月之前或之后但仍在当年的日期)
        Calendar calCurrentYearDifferentDay = Calendar.getInstance();
        calCurrentYearDifferentDay.set(Calendar.MONTH, 0); // 月份从0开始，0表示1月
        calCurrentYearDifferentDay.set(Calendar.DAY_OF_MONTH, 15);
        calCurrentYearDifferentDay.set(Calendar.HOUR_OF_DAY, 12);
        calCurrentYearDifferentDay.set(Calendar.MINUTE, 0);
        calCurrentYearDifferentDay.set(Calendar.SECOND, 0);
        Date date4 = calCurrentYearDifferentDay.getTime();
        // 确保这个日期不在当天
        Calendar tempCal = Calendar.getInstance();
        if (tempCal.get(Calendar.YEAR) == calCurrentYearDifferentDay.get(Calendar.YEAR) &&
                (tempCal.get(Calendar.DAY_OF_YEAR) != calCurrentYearDifferentDay.get(Calendar.DAY_OF_YEAR))) {
            System.out.println("当年非当天日期: " + formatRelativeTime(date4));
        } else {
            System.out.println("请调整系统时间或代码，以便测试当年非当天日期的情况。");
        }


        // 跨年 yyyy-MM-dd HH:mm:ss
        Calendar calLastYear = Calendar.getInstance();
        calLastYear.add(Calendar.YEAR, -1); // 去年
        calLastYear.set(Calendar.MONTH, 11); // 11表示12月
        calLastYear.set(Calendar.DAY_OF_MONTH, 31);
        calLastYear.set(Calendar.HOUR_OF_DAY, 23);
        calLastYear.set(Calendar.MINUTE, 59);
        calLastYear.set(Calendar.SECOND, 59);
        Date date5 = calLastYear.getTime();
        System.out.println("去年日期: " + formatRelativeTime(date5));
    }
}